package main

import "fmt"

/*
Go 语言允许向函数传递指针，只需要在函数定义的参数上设置为指针类型即可。

以下实例演示了如何向函数传递指针，并在函数调用后修改函数内的值，：
*/
func main() {
	/* 定义局部变量 */
	var a int = 100
	var b int = 200
	//swapVal(a, b)	//不会改变a，b的值
	fmt.Printf("交换前 a 的值 : %d\n", a)
	fmt.Printf("交换前 b 的值 : %d\n", b)

	/* 调用函数用于交换值
	 * &a 指向 a 变量的地址
	 * &b 指向 b 变量的地址
	传递的是地址，就会改变外部的值
	*/
	swap(&a, &b)

	fmt.Printf("交换后 a 的值 : %d\n", a)
	fmt.Printf("交换后 b 的值 : %d\n", b)
	/*
		对于swap1(a int, b int) 和 swap2(a *int, b *int)
		swap1不会改变外部变量的值
		swap2会改变外部变量的值
	*/
}

func swap(x *int, y *int) {
	var temp int
	temp = *x /* 保存 x 地址的值 */
	*x = *y   /* 将 y 赋值给 x */
	*y = temp /* 将 temp 赋值给 y */
}

func swapVal(a int, b int) {
	temp := a
	a = b
	b = temp
}
